#ifndef _PROTOCOL_H
#define _PROTOCOL_H

#include "stm32f0xx.h"
#include "string.h"
#include "stdlib.h"
#include "usart.h"
#include "rd522.h"
#include "iso14443.h"
#include "des.h"

#define PRO_DEBUG 0

#define PRO_ADDR 0x01	//模块地址
#define PRO_HEAD 0xAA	//帧头
#define PRO_END  0xBB	//帧尾

#define PRO_OK					0x88	//操作成功
#define PRO_UID_N4				0x86	//成功获取uid但不支持ISO14443-4
#define PRO_FAIL				0x68	//操作失败
#define PRO_ERR_PARA			0x67	//参数错误
#define PRO_ERR_RATS			0x65	//激活失败
#define PRO_ERR_LIMIT			0x64	//权限不够
#define PRO_ERR_FILELIM			0x62	//读/写文件的数据长度超出文件大小限制
#define PRO_ERR_LENGTH			0x61	//数据帧长度错误
#define PRO_ERR_BCC				0x60	//数据帧校验错误
#define PRO_NEXIT_CMD			0x4a	//命令不存在
#define PRO_NEXIT_KEY			0x47	//密钥不存在
#define PRO_NEXIT_DIR			0x46	//文件/目录不存在
//0x5x  外部认证错误剩余x(0-f)次机会

//数据帧命令
typedef enum
{
	GET_VER		= 0x01,		//获取模块版本
	GET_UID		= 0x02,		//获取uid
	STOP		= 0x05,		//下电
	OUT_AUTHENT	= 0x16,		//外部认证
	MOD_KEY		= 0x18,		//修改密钥
	CART_INIT	= 0x23,		//卡片初始化
	CART_DEL	= 0x27,		//卡片回收
	READ_FILE	= 0x33,		//读二进制文件
	WRITE_FILE	= 0x34,		//写二进制文件
	USER_CMD	= 0x40,		//用户自定义命令
	
}pro_cmd_t;

//数据帧缓存结构体
typedef struct
{
	pro_cmd_t command;	//命令
	uint8_t length;		//数据长度不包括帧头尾地址校验还有它本身
	uint8_t bcc;		//异或校验
	uint8_t data[128];	//数据缓存
	uint8_t res_flag;	//接收状态标志 0-允许接收，1-接收完成等待命令操作，2-数据长度错误
}pro_buff_t;

extern pro_buff_t pro_buff;

void pro_usart_res(uint8_t res);
void pro_task(void);
void get_uid(uint8_t *sak);
void stop(uint8_t sak);
void out_authent(uint8_t *temp);
void card_init(uint8_t *temp);
void card_delete(uint8_t *temp);
void read_file(uint8_t *temp);
void write_file(uint8_t *temp);
void mod_key(uint8_t *temp);
void user_cmd(uint8_t *temp);


#endif






